import React, { useState, useEffect } from 'react'; import { BookOpen, Brain, List, ChevronRight, ChevronLeft, RotateCcw, CheckCircle2, XCircle, GraduationCap, Volume2, Loader2, ImageIcon, Keyboard, ArrowRight, User } from 'lucide-react'; const WORD_DATA = [ { id: 1, hebrew: "ילד", arabic: "وَلَد", phonetic: "וַלַד", imgTag: "boy,child,photography" }, { id: 2, hebrew: "מתנה", arabic: "هَدِيَّة", phonetic: "הַדִיָּה", imgTag: "gift,present,box" }, { id: 3, hebrew: "שעון", arabic: "סָאעַה", phonetic: "סָאעַה", imgTag: "clock,wall,watch", arabicText: "سَاعَة" }, { id: 4, hebrew: "נסיך", arabic: "أَمِير", phonetic: "אַמִיר", imgTag: "prince,royal,photography" }, { id: 5, hebrew: "מורה (זכר)", arabic: "مُעَلِّמ", phonetic: "מֻעַלֶּם", imgTag: "teacher,classroom,man" }, { id: 6, hebrew: "תפוח", arabic: "תֻּפַּאח", phonetic: "תֻפַּאח", imgTag: "apple,red,fruit" }, { id: 7, hebrew: "אמא", arabic: "أُمّ", phonetic: "אֻם", imgTag: "mother,portrait,woman" }, { id: 8, hebrew: "אבא", arabic: "أَب", phonetic: "אַב", imgTag: "father,portrait,man" }, { id: 9, hebrew: "סבא", arabic: "جَدّ", phonetic: "גַ'ד", imgTag: "grandfather,portrait,oldman" } ]; const App = () => { const [view, setView] = useState('home'); const [currentIndex, setCurrentIndex] = useState(0); const [isRevealed, setIsRevealed] = useState(false); const [quizScore, setQuizScore] = useState(0); const [quizStep, setQuizStep] = useState(0); const [quizQuestions, setQuizQuestions] = useState([]); const [quizFinished, setQuizFinished] = useState(false); const [selectedAnswer, setSelectedAnswer] = useState(null); const [playingAudio, setPlayingAudio] = useState(null); const [tutorImage, setTutorImage] = useState(null); const [loadingTutor, setLoadingTutor] = useState(true); // יצירת דמות המורה הריאליסטית ביותר באמצעות Imagen 4.0 useEffect(() => { const generateTutor = async () => { const apiKey = ""; const url = `https://generativelanguage.googleapis.com/v1beta/models/imagen-4.0-generate-001:predict?key=${apiKey}`; const prompt = "A photorealistic cinematic 8k portrait of a friendly young man with short dark brown hair and fair skin. Waist-up shot, looking directly at the camera. He is wearing a high-quality navy blue hoodie. Professional lighting, warm smile, sharp focus on facial features. Background is a soft blurred modern classroom. Photorealistic masterpiece."; const payload = { instances: [{ prompt }], parameters: { sampleCount: 1 } }; try { const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); const result = await response.json(); if (result.predictions?.[0]?.bytesBase64Encoded) { setTutorImage(`data:image/png;base64,${result.predictions[0].bytesBase64Encoded}`); } } catch (err) { console.error("Failed to generate realistic tutor", err); } finally { setLoadingTutor(false); } }; generateTutor(); }, []); // האזנה למקש הרווח useEffect(() => { const handleKeyDown = (e) => { if (e.code === 'Space') { if (view === 'cards') { e.preventDefault(); if (!isRevealed) setIsRevealed(true); else if (currentIndex < WORD_DATA.length - 1) { setCurrentIndex(prev => prev + 1); setIsRevealed(false); } } } }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); }, [view, isRevealed, currentIndex]); const pcmToWav = (pcmData, sampleRate) => { const buffer = new ArrayBuffer(44 + pcmData.length * 2); const view = new DataView(buffer); const writeString = (offset, string) => { for (let i = 0; i < string.length; i++) view.setUint8(offset + i, string.charCodeAt(i)); }; writeString(0, 'RIFF'); view.setUint32(4, 32 + pcmData.length * 2, true); writeString(8, 'WAVE'); writeString(12, 'fmt '); view.setUint32(16, 16, true); view.setUint16(20, 1, true); view.setUint16(22, 1, true); view.setUint32(24, sampleRate, true); view.setUint32(28, sampleRate * 2, true); view.setUint16(32, 2, true); view.setUint16(34, 16, true); writeString(36, 'data'); view.setUint32(40, pcmData.length * 2, true); for (let i = 0; i < pcmData.length; i++) view.setInt16(44 + i * 2, pcmData[i], true); return new Blob([buffer], { type: 'audio/wav' }); }; const playArabicWord = async (word) => { if (playingAudio) return; setPlayingAudio(word); const apiKey = ""; const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-tts:generateContent?key=${apiKey}`; const payload = { contents: [{ parts: [{ text: `Say clearly in Arabic: ${word}` }] }], generationConfig: { responseModalities: ["AUDIO"], speechConfig: { voiceConfig: { prebuiltVoiceConfig: { voiceName: "Kore" } } } } }; try { const response = await fetch(url, { method: 'POST', body: JSON.stringify(payload) }); const result = await response.json(); const audioData = result.candidates?.[0]?.content?.parts?.[0]?.inlineData; if (audioData) { const binaryString = atob(audioData.data); const bytes = new Int16Array(binaryString.length / 2); for (let i = 0; i < binaryString.length; i += 2) bytes[i/2] = (binaryString.charCodeAt(i+1) << 8) | binaryString.charCodeAt(i); const audio = new Audio(URL.createObjectURL(pcmToWav(bytes, 24000))); audio.onended = () => setPlayingAudio(null); audio.play(); } else setPlayingAudio(null); } catch { setPlayingAudio(null); } }; const Home = () => (
{loadingTutor ? (

מכין את המורה לשיעור...

) : (
{tutorImage ? ( Tutor ) : (
טוען...
)}
)}

ערבית עם מורה אישי

מוכן להתחיל לתרגל?

); const TopBar = ({ title, tutorText }) => (

{title}

{tutorImage ? Tutor : }

{tutorText}

{title}

); const Cards = () => { const word = WORD_DATA[currentIndex]; return (
setIsRevealed(!isRevealed)} className={`relative w-full h-full transition-transform duration-[800ms] ease-in-out transform-style-3d cursor-pointer ${isRevealed ? 'rotate-y-180' : ''}`}> {/* צד קדמי */}
{word.hebrew}
{ e.stopPropagation(); playArabicWord(word.arabic); }} className={`absolute top-4 left-4 p-3 rounded-2xl shadow-lg transition-all border-2 border-blue-100 z-20 ${playingAudio === word.arabic ? 'bg-blue-600 text-white animate-pulse scale-110' : 'bg-white/90 backdrop-blur-sm text-blue-600 hover:bg-blue-50 active:scale-90'}`} > {playingAudio === word.arabic ? : }
עברית

{word.hebrew}

{/* צד אחורי */}
ערבית

{word.arabic}

({word.phonetic})
{ e.stopPropagation(); playArabicWord(word.arabic); }} className={`mt-8 p-6 rounded-full shadow-2xl transition-all cursor-pointer ${playingAudio === word.arabic ? 'bg-blue-600 text-white animate-pulse' : 'bg-white text-blue-600 border-2 border-blue-100 hover:bg-blue-50'}`}> {playingAudio === word.arabic ? : }
רווח: הופך כרטיס ועובר הלאה
); }; const Quiz = () => { if (quizFinished) return (
{tutorImage && Tutor}

סיכום המבחן!

{Math.round((quizScore/quizQuestions.length)*100)}%
); const q = quizQuestions[quizStep]; return (
Quiz target

{q.word.hebrew}

{q.options.map(opt => (
{ if(selectedAnswer) return; setSelectedAnswer(opt.id); const correct = opt.id === q.word.id; if(correct) setQuizScore(s=>s+1); setTimeout(()=>{ if(quizStepprev+1); else setQuizFinished(true); setSelectedAnswer(null); }, 1200); }} className={`p-5 md:p-6 rounded-[1.5rem] border-4 transition-all flex justify-between items-center cursor-pointer shadow-md ${selectedAnswer === null ? 'bg-white border-slate-100 hover:border-blue-300' : opt.id === q.word.id ? 'bg-emerald-50 border-emerald-500 text-emerald-800 scale-[1.02] shadow-xl' : selectedAnswer === opt.id ? 'bg-rose-50 border-rose-500 text-rose-800' : 'bg-white opacity-40 grayscale'}`}>
{opt.arabic} ({opt.phonetic})
{ e.stopPropagation(); playArabicWord(opt.arabic); }} className={`p-3 rounded-xl transition-all ${playingAudio === opt.arabic ? 'bg-blue-600 text-white' : 'text-slate-300 hover:text-blue-500 hover:bg-blue-50'}`}> {playingAudio === opt.arabic ? : }
{selectedAnswer && opt.id === q.word.id && } {selectedAnswer === opt.id && opt.id !== q.word.id && }
))}
); }; const WordList = () => (
{WORD_DATA.map(w => (
{w.hebrew}
{w.hebrew}
({w.phonetic})
{w.arabic}
playArabicWord(w.arabic)} className={`p-3 rounded-full transition-all cursor-pointer ${playingAudio === w.arabic ? 'bg-blue-600 text-white shadow-lg' : 'bg-slate-50 text-slate-300 hover:text-blue-500 hover:bg-blue-50 border'}`}> {playingAudio === w.arabic ? : }
))}
); return (
{view === 'home' && } {view === 'cards' && } {view === 'quiz' && } {view === 'list' && }